package com.will.network;

import android.content.Context;
import android.util.Log;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.google.gson.reflect.TypeToken;

import org.apache.http.protocol.HttpContext;

import java.util.HashMap;
import java.util.Map;


public class RequestManager {

    private static RequestManager mInstance;
    private RequestQueue mRequestQueue;

    private final String TAG = "Volley";
    private Context mContext;


    public static synchronized RequestManager getInstance() {
        if(mInstance == null)
            mInstance = new RequestManager();
        return mInstance;
    }

    public void init(Context context){
        mContext = context;
    }


    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
//            FakeX509TrustManager.allowAllSSL();
        }

        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        addToRequestQueue(req, null);
    }

    public <T> void addToRequestQueue(Request<T> req, Object tag) {
        // set the default tag if tag is empty
        req.setTag(tag == null ? TAG : tag);
        getRequestQueue().add(req);
    }

    public <T> void addToRequestQueue(Request<T> req, Object tag, int retries, int timeout) {
        req.setRetryPolicy(new DefaultRetryPolicy(
                timeout <= 0 ? DefaultRetryPolicy.DEFAULT_TIMEOUT_MS : timeout,
                retries <= 0 ? DefaultRetryPolicy.DEFAULT_MAX_RETRIES : retries,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        addToRequestQueue(req, tag);
    }

    public <T> void addToRequestQueue(Request<T> req, Object tag, int retryTime) {
        addToRequestQueue(req, tag, DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, retryTime);
    }

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }

//    public static void test(String[] args) {
//
//        ApiModelRequest<String> request = new ApiModelRequest<>(//"http://m.baidu.com",
////        "http://www.weather.com.cn/data/sk/101010100.html",
//        "http://115.238.51.194:7203/core/v1/personal_show/hot?start=0&limit=10",
//        new TypeToken<String>() {
//        }, new Response.Listener<String>() {
//            @Override
//            public void onResponse(String s) {
//                Log.d("onResponse", s);
//            }
//        }, new Response.ErrorListener() {
//            @Override
//            public void onErrorResponse(VolleyError volleyError) {
//                Log.d("onResponse", "error:" + volleyError.toString());
//            }
//        });
////        Map<String, String> headers = new HashMap<>();
////        headers.put("Content-Type", "application/json");
//        getInstance().addToRequestQueue(request, "test");
//
//    }


//    public static String searchBgImageUrl(String query){
//        final String DOOREME_API_URL = "http://www.doore.me";
//        final String HOST = String.format("%s/searchapp/api", DOOREME_API_URL);
////        String url = String.format("%s/search/image?query=%s&location=%s", HOST, equery, LocationManager.getInstance().getLocation().city != null ? URLEncoder.encode(LocationManager.getInstance().getLocation().city) : "");
//        String url = String.format("%s%s", HOST, getBuilder(ZLApi.SEARCH.IMAGE)
//                        .appendQueryParameter("query", query);
//        );
//        return url;
//    }

//    Timeout - 3000 secs, Num of Attempt - 2, Back Off Multiplier - 2
//    Attempt 1:
//
//    time = time + (time * Back Off Multiplier );
//    time = 3000 + 6000 = 9000
//    Socket Timeout = time;
//    Request dispatched with Socket Timeout of 9 Secs
//    Attempt 2:
//
//    time = time + (time * Back Off Multiplier );
//    time = 9000 + 18000 = 27000
//    Socket Timeout = time;
//    Request dispatched with Socket Timeout of 27 Secs




//    public static HttpContext CURRENT_CONTEXT;
//    public static PersistentCookieStore myCookieStore;
//
//    // List<Cookie> cookies = httpClient.getCookieStore().getCookies();
//    // for (Cookie cookie:cookies){
//    // myCookieStore.addCookie(cookie);
//    // }
//
//    /**
//     * 设置当前使用的上下文环境
//     *
//     * @param context
//     */
//    public static void setContext(HttpContext context) {
//        CURRENT_CONTEXT = context;
//    }
//
//    /**
//     * 创建一个使用Cookie的上下文环境
//     *
//     * @param setAsCurrentContext
//     *            是否创建为当前的上下文环境，如果为true替换CURRENT_CONTEXT
//     * @return
//     */
//    public static HttpContext cookieContext(boolean setAsCurrentContext) {
//        if (getCookieStore(CURRENT_CONTEXT) != null)
//            return CURRENT_CONTEXT;
//
//        CookieStore store = myCookieStore;
//        HttpContext context = new BasicHttpContext();
//        context.setAttribute(ClientContext.COOKIE_STORE, store);
//        if (setAsCurrentContext)
//            CURRENT_CONTEXT = context;
//        return context;
//    }
//
//    /**
//     * 获取 Cookie存储.
//     *
//     * @param context
//     *            上下文，为空则使用当前上下文
//     * @return
//     */
//    public static CookieStore getCookieStore(HttpContext context) {
//        HttpContext ctx = context == null ? CURRENT_CONTEXT : context;
//        return (CookieStore) (ctx == null ? null : ctx
//                .getAttribute(ClientContext.COOKIE_STORE));
//    }
//
//    /**
//     * 获取指定的Cookie信息
//     *
//     * @param context
//     *            上下文，为空则使用默认上下文
//     * @param name
//     *            Cookie名称
//     * @return
//     */
//    public static Cookie getCookie(final HttpContext context, String name) {
//        HttpContext ctx = context == null ? CURRENT_CONTEXT : context;
//        if (ctx == null)
//            return null;
//        CookieStore store = (CookieStore) ctx
//                .getAttribute(ClientContext.COOKIE_STORE);
//        if (store == null)
//            return null;
//
//        for (Cookie cookie : store.getCookies()) {
//            if (cookie.getName().equals(name))
//                return cookie;
//        }
//        return null;
//    }

}
